#include "NGramas.h"
#include "miniGoogle.h"
#include "cargadorDeArchivos.h"
#include <stdio.h>
#include <math.h>
#define TEST_SET "test_v2.txt"
//#define LIMITE_DE_FRASES 10000
//#define COEFICIENTE_GOOGLE 0.5

//TODO: probada para header = "id","sentence", corroborar
/*FILE* abrirTestSet(){
	FILE* file = fopen(TEST_SET, "r");
	char str[20];
	fscanf(file, "%[^\n]\n", str); //LE SACO EL HEADER!
	return file;
}
*/


//TODO: header = "id","sentence", corroborar
/*FILE* abrirResultado(){
	FILE* file = fopen("pepito.txt", "w");
	string header = "";
	header += '"';
	header += "id";
	header += '"';
	header += ',';
	header += '"';
	header += "sentence";
	header += '"';
	header += '\n';

	fprintf(file, header.c_str());
	return file;
}
*/
//probada
/*
string leerFraseDelTest(FILE* testSet, int id){
	int len = 10000;
	char str[len];
	int lenId = floor((int)log10((float)id)) + 1;
	fscanf(testSet, "%[^\n]\n", str);
	string frase = "";
	frase += str;
	frase = frase.substr( lenId + 2, frase.length() - (3 + lenId) );

	return frase;
}
*/
/*
string completarFrase(string fraseIncompleta,
		diccionario_t* dic,
		diccionarioPorIndice_t* dicPorIndice,
		mapaDeTrigramas_t* trigramas){
	vector<string> palabras;
	split(fraseIncompleta, ' ', &palabras);
	size_t cantidadPalabrasEnFrase = palabras.size();
	if(cantidadPalabrasEnFrase == 0) return "Hello!"; //obvio, por educacion
	size_t iMin = encontrarHueco(palabras, dic, dicPorIndice, trigramas);
	vector<palabraYProbabilidad> candidatas = obtenerCandidatas(
			palabras[iMin-2], palabras[iMin-1],
			dic, dicPorIndice, trigramas);
	size_t cantidadDeCandidatas = candidatas.size();
	float distancia;
	palabraYProbabilidad palabraFaltante;
	float probabilidadActual;
	palabraFaltante.probabilidad = 0; palabraFaltante.palabra = "the"; //cualquier cosa, que agregue "the"
	for(size_t i = 0; i < cantidadDeCandidatas; i++){
		distancia = (miniGoogleDistanciaPalabraFrase(candidatas[i].palabra, fraseIncompleta, dic, dicPorIndice));
		probabilidadActual = (1- COEFICIENTE_GOOGLE)*candidatas[i].probabilidad + COEFICIENTE_GOOGLE * (1 - distancia);
		if(probabilidadActual > palabraFaltante.probabilidad){
			palabraFaltante.palabra = candidatas[i].palabra;
			palabraFaltante.probabilidad = probabilidadActual;
		}
	}
	string fraseCompleta = palabras[0];
	for(size_t j = 1; j < cantidadPalabrasEnFrase; j++){
		if(j == iMin)
			fraseCompleta += palabraFaltante.palabra;
		fraseCompleta += palabras[j];
	}
	return fraseCompleta;
}

//probada!
void guardarFraseEnResultado(FILE* archivo, int id, string frase){
	fprintf(archivo, "%d,%c%s%c\n", id, '"', frase.c_str(),'"');
}
*/

//TODO: fijate ahora si anda, que probe la leerFrase
/*
void extraerIndices(FILE* testSet, diccionario_t* dic, set<int>* indices){

	string fraseIncompleta;
	int id = 1;

	while(!feof(testSet)){
		fraseIncompleta = leerFraseDelTest(testSet, id);
		vector<string> palabrasDeFrase;
		split(fraseIncompleta, ' ', &palabrasDeFrase);
		for(auto& palabra : palabrasDeFrase)
			if(dic->mapa.find(palabra) != dic->mapa.end())
				indices->insert(dic->mapa.at(palabra).index);

		id++;
	}

}
*/

/*
int main(){
	diccionarioPorIndice_t dicPorIndice;
	diccionario_t dicAMedias;
	cargarDiccionarioAMedias(& dicAMedias);
	FILE* testSet;
	testSet = abrirTestSet();
	set<int> indicesDelTestSet;
	extraerIndices(testSet, & dicAMedias, &indicesDelTestSet);
	dicAMedias.mapa.clear();

	diccionario_t dic;
	cargarDiccionario(&dic, &dicPorIndice, &indicesDelTestSet);
	mapaDeTrigramas_t trigramas;
	cargarTrigramas(&indicesDelTestSet, &trigramas);
	indicesDelTestSet.clear();

	fclose(testSet);
	testSet = abrirTestSet();

	FILE* fileResultado;
	fileResultado = abrirResultado();

	string fraseIncompleta, fraseCompleta;
	int id = 1;
	while(!feof(testSet)){
		fraseIncompleta = leerFraseDelTest(testSet, id);
		fraseCompleta = completarFrase(fraseIncompleta, &dic, & dicPorIndice, &trigramas);
		guardarFraseEnResultado(fileResultado, id, fraseCompleta);
		id++;
	}
	fclose(testSet);
	fclose(fileResultado);
	return 0;
}
*/




